home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Interactive 7
/
PC World Interactive 7.iso
/
program
/
cprog.EXE
/
OBJ2ASM.ZIP
/
ORGRPDEF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-01
|
4KB
|
133 lines
#include <stdio.h>
#include <string.h>
#include "o.h"
char grp_operands[100] = {0};
#define GRP_SI 0xFF /* Segment Index */
#define GRP_EI 0xFE /* External Index */
#define GRP_SCO 0xFD /* Segment/Class/Overlay Indices */
#define GRP_LTL 0xFB /* Load Time Locatable */
#define GRP_ABS 0xFA /* Absolute */
extern int name_compare( NAME_T *, NAME_T * );
extern int seg_compare( SEG_T *, SEG_T * );
int grp_compare( GRP_T *, GRP_T * );
void grp_insert( int );
int grp_compare( rec_1, rec_2 )
GRP_T *rec_1;
GRP_T *rec_2;
{
if ( rec_1->index > rec_2->index ) {
return( LEFT );
} else {
if ( rec_1->index < rec_2->index ) {
return( RIGHT );
} else {
return( EQUAL );
}
}
}
void grp_insert( name_idx )
int name_idx;
{
static group_count = 0;
GRP_T *group_rec;
group_count++;
group_rec = (GRP_T *)o_malloc( sizeof(GRP_T) );
group_rec->index = group_count;
group_rec->name = name_idx;
insert( (char *)group_rec, group_tree, TC grp_compare );
}
void grpdef( length )
word length;
{
NAME_T name_search;
NAME_T *group;
NAME_T *segment;
SEG_T seg_search;
SEG_T *seg;
int gcd;
int name_idx;
char *group_text;
char *group_name;
length -= get_index( &name_search.index );
name_idx = name_search.index;
group = (NAME_T *)find( (char *)&name_search, name_tree, TC name_compare,
NULL );
if ( group == NULL ) {
fmt_error("Undefined name index");
}
group_text = "GROUP";
group_name = group->name;
grp_operands[0] = '\0';
--length; /* To account for check sum at bottom */
while ( length ) {
--length;
gcd = get_byte();
switch( gcd ) {
case GRP_SI:
length -= get_index( &seg_search.index );
seg = (SEG_T *)find( (char *)&seg_search,
segment_tree, TC seg_compare, NULL );
if ( seg == NULL ) fmt_error("Undefined segment" );
name_search.index = seg->name;
segment = (NAME_T *)find( (char *)&name_search,
name_tree, TC name_compare, NULL );
if ( strlen(grp_operands) + strlen(segment->name) > 50 ) {
strcat( grp_operands, "\\" );
if ( strcmp(group_name,"FLAT") != 0 ) {
out_line( group_name, group_text, grp_operands, "" );
}
group_name = "";
group_text = "";
grp_operands[0] = '\0';
}
strcat( grp_operands, segment->name );
if ( length ) {
strcat( grp_operands, ", " );
}
break;
case GRP_EI:
fprintf( stderr, "Group Component: GRP_EI (External Index)\n");
fmt_error("Un-implemented GROUP operands");
break;
case GRP_SCO:
fprintf( stderr, "Group Component: GRP_SCO (Seg/Class/Ovly Index)\n");
fmt_error("Un-implemented GROUP operands");
break;
case GRP_LTL:
fprintf( stderr, "Group Component: GRP_LTL (LTL data)\n");
fmt_error("Un-implemented GROUP operands");
break;
case GRP_ABS:
fprintf( stderr, "Group Component: GRP_ABS (Absolute)\n");
fmt_error("Un-implemented GROUP operands");
break;
default:
fprintf( stderr, "Group Component: %02X (?)\n", gcd );
fmt_error("Un-implemented GROUP operands");
break;
}
}
if ( strcmp(group_name,"FLAT") != 0 ) {
out_line( group_name, group_text, grp_operands, "" );
out_newline(); /* Leave a blank line after Group directive */
}
grp_insert( name_idx );
}